# -*- coding: UTF-8 -*-
import datetime
from django.conf import settings
from django.utils import simplejson
from django.core import serializers
from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth import logout
from django.middleware.csrf import get_token
from django.views.decorators.csrf import csrf_exempt
from django.utils.datastructures import SortedDict
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext

from avanza.avanzaweb.models import *
from avanza.mdm.models import *
from avanza.mdm.forms import *

import sys

from django.db.models import Max


class JSONDateTimeEncoder(simplejson.JSONEncoder):
     def default(self, obj):
          if isinstance(obj, (datetime.date, datetime.datetime)):
               return obj.strftime('%d/%m/%Y') #obj.isoformat()
          else:
               return simplejson.JSONEncoder.default(self, obj)


#~ Decorador JSON
def json_view(func):
     def wrap(request, *a, **kw):
          response = ''
          response = func(request, *a, **kw)
          json = simplejson.dumps(response, cls=JSONDateTimeEncoder)
          return HttpResponse(json, mimetype='application/json')
     return wrap
#~ Fin decorador

@json_view
def datos_promo(request, id):
     if request.is_ajax():
          promo = Promocion.objects.get(pk = id)
          respuesta = {}
          respuesta['nombre'] = promo.nombre
          respuesta['descripcion'] = promo.descripcion
          respuesta['memoria'] = promo.memoria
          respuesta['fecha'] = promo.fecha
          respuesta['direccion'] = promo.direccion
          respuesta['cp'] = promo.cp
          respuesta['localidad'] = promo.localidad
          respuesta['vigente'] = promo.vigente
          respuesta['enmenu'] = promo.enmenu
          respuesta['orden'] = promo.orden
          return respuesta

@json_view
def datos_pag(request, id):
     if request.is_ajax():
          promo = Contenido.objects.get(pagina__id = id)
          respuesta = {}
          respuesta['texto'] = promo.texto
          return respuesta

@json_view
def media_promo(request, id):
     from django.conf import settings
     if request.is_ajax():
          respuesta =  SortedDict()
          med = Promocion_Media.objects.select_related().filter(promocion = id).order_by('orden')
          for m in med:
               t = ''
               if m.media.thumbnail:
                    t = settings.MEDIA_URL + m.media.thumbnail
               if m.media.tipo == 'F':  # Para que no se solapen los elementos
                    orden = 1000 + m.orden
               elif m.media.tipo == 'FC':
                    orden = 2000 + m.orden
               else:
                    orden = 3000 + m.orden
               respuesta[orden] = {'id': m.id,'foto': m.media.file.url, 'thumb': t, 'tipo': m.media.tipo, 'size': imgsize(m.media.file), 'ds':  m.media.descripcion or m.descripcion or u'Sin descripción'}
          return respuesta

@json_view
def media_pag(request, id):
     from django.conf import settings
     if request.is_ajax():
          respuesta =  SortedDict()
          med = Pagina_Media.objects.select_related().filter(pagina__id = id).order_by('orden')
          for m in med:
               t = ''
               if m.media.thumbnail:
                    t = settings.MEDIA_URL + m.media.thumbnail
               respuesta[1000 + m.orden] = {'id': m.id, 'foto': m.media.file.url, 'thumb': t, 'tipo': m.media.tipo, 'size': imgsize(m.media.file), 'ds':  m.media.descripcion or m.descripcion or u'Sin descripción'}
          return respuesta

@json_view
def media_fondo(request, ini):
     from django.conf import settings
     if request.is_ajax():
          respuesta =  {}
          med = Media.objects.select_related().filter(inicial = ini, tipo = 'F')
          for m in med:
               t = settings.MEDIA_URL + m.thumbnail
               if m.inicial:
                    respuesta[1000 + m.orden] = {'id': m.id, 'foto': m.file.url, 'thumb': t, 'size': imgsize(m.file), 'ds':  m.descripcion or u'Sin descripción'}                                        
               else:
                    respuesta[m.id] = {'id': m.id, 'foto': m.file.url, 'thumb': t, 'size': imgsize(m.file), 'ds':  m.descripcion or u'Sin descripción'}
          return respuesta

def logout_view(request):
     logout(request)
     return render_to_response('mdm/logout.html', context_instance=RequestContext(request))
     
@user_passes_test(lambda u: u.is_superuser)
def index(request):
     titulo = 'Avanza - Menú administración - Promociones'
     promos = Promocion.objects.all().order_by('orden')
     return render_to_response('mdm/inicio.html', {
                                                                                     'titulo': titulo, 
                                                                                     'promos': promos, 
                                                                                     'session_cookie_name': settings.SESSION_COOKIE_NAME,
                                                                                     'session_key': request.session.session_key,
                                                                                     'csrf_token_name': settings.CSRF_COOKIE_NAME,
                                                                                     'csrf_token': get_token(request),
                                                                                }, context_instance=RequestContext(request))

@user_passes_test(lambda u: u.is_superuser)
def fondos(request):
     titulo = 'Avanza - Menú administración - Gestión de imágenes de presentación'    
     return render_to_response('mdm/fondos.html', {
                                                                                     'titulo': titulo, 
                                                                                     'session_cookie_name': settings.SESSION_COOKIE_NAME,
                                                                                     'session_key': request.session.session_key,
                                                                                     'csrf_token_name': settings.CSRF_COOKIE_NAME,
                                                                                     'csrf_token': get_token(request),
                                                                                }, context_instance=RequestContext(request))

@user_passes_test(lambda u: u.is_superuser)
def contenidos(request):
     titulo = 'Avanza - Menú administración - Contenidos'
     promos = Pagina.objects.all()
     return render_to_response('mdm/contenidos.html', {
                                                                                     'titulo': titulo, 
                                                                                     'promos': promos, 
                                                                                     'session_cookie_name': settings.SESSION_COOKIE_NAME,
                                                                                     'session_key': request.session.session_key,
                                                                                     'csrf_token_name': settings.CSRF_COOKIE_NAME,
                                                                                     'csrf_token': get_token(request),
                                                                                }, context_instance=RequestContext(request))

@user_passes_test(lambda u: u.is_superuser)
def encuestas(request):
     titulo = 'Avanza - Menú administración - Encuestas'
     promos = Promocion.objects.all()
     return render_to_response('mdm/encuestas.html', {
                                                                                     'titulo': titulo, 
                                                                                     'promos': promos, 
                                                                                     'session_cookie_name': settings.SESSION_COOKIE_NAME,
                                                                                     'session_key': request.session.session_key,
                                                                                     'csrf_token_name': settings.CSRF_COOKIE_NAME,
                                                                                     'csrf_token': get_token(request),
                                                                                }, context_instance=RequestContext(request))

@user_passes_test(lambda u: u.is_superuser)
@json_view
def encuestas_promo(request, id):
      if request.is_ajax():
          respuesta =  SortedDict()
          med = Survey.objects.filter(promocion__id = id)
          tabla = u'''
               <h3>Encuesta %s</h3></br><input type="checkbox" id="publicada" style="vertical-align:top;" rel="%s" %s/>Mostrar en resultados
               <table class="encuesta">
                    <tr><td>Fecha</td><td id="fecha">%s</td></tr>
                    <tr><td>IP</td><td id="ip">%s</td></tr>
                    <tr><td>Usuario</td><td id="usuario">%s</td></tr>
                    <tr><td>Presentaci&oacute;n en Internet inicial</td><td id="internetant">%s</td></tr>
                    <tr><td>Presentaci&oacute;n en Internet actual</td><td id="internetnew">%s</td></tr>
                    <tr><td>Trato en la visita</td><td id="trato">%s</td></tr>
                    <tr><td>Estudio personalizado de financiaci&oacute;n</td><td id="estudio">%s</td></tr>
                    <tr><td>Satisfacci&oacute;n estudio personalizado de financiaci&oacute;n</td><td id="satis_plan">%s</td></tr>
                    <tr><td>Satisfacci&oacute;n materiales y construcci&oacute;n</td><td id="satis_viv">%s</td></tr>
                    <tr><td>Aspectos a mejorar</td><td id="mejoras">%s</td></tr>
                    <tr><td>Otros aspectos a mejorar</td><td id="otros_mejoras">%s</td></tr>
                    <tr><td>Observaciones sobre mejoras</td><td id="obs_mejoras">%s</td></tr>
                    <tr><td>Trato postventa</td><td id="posventa">%s</td></tr>
                    <tr><td>Observaciones trato postventa</td><td id="obs_posventa">%s</td></tr>
                    <tr><td>Relación calidad-precio</td><td id="calidad_precio">%s</td></tr>
                    <tr><td>Toma de decisi&oacute;n</td><td id="aspecto">%s</td></tr>
                    <tr><td>Otros comentarios<br/><input type="checkbox" id="pub_comentario" style="vertical-align:top;" rel="%s" %s/>Mostrar comentario</td><td id="comentario">%s</td></tr>
               </table>
               <br/>
               '''
          for m in med:
               respuesta[m.id] =  { 'tabla': tabla % ( m.id, m.id, u'checked' if m.publicada else '', m.fecha.strftime("%d/%m/%Y"), m.ip, m.usuario, m.internetant, m.internetnew, m.trato,  u'Sí' if m.estudio else u'No', m.satis_plan, m.satis_viv, m.mejoras, m.otros_mejoras, m.obs_mejoras, m.posventa, m.obs_posventa, m.calidad_precio, m.aspecto, m.id,  u'checked' if m.pub_comentario else '', m.comentario)}
          return respuesta


def imgsize (ruta):
     from PIL import Image
     image = Image.open(ruta)
     return image.size

@user_passes_test(lambda u: u.is_superuser)
@csrf_exempt
def subida(request):
     if request.method == 'POST':
          for field_name in request.FILES:
               uploaded_file = request.FILES[field_name]
               new_media = Media(file = uploaded_file, tipo = request.POST['tipo_media'], inicial = False, asignado = True)
               new_media.save()
               ord = 0
               #~ try:
               maxorden = Promocion_Media.objects.filter(promocion__exact = int(request.POST['promo_id'])).aggregate(Max('orden'))
               if maxorden['orden__max'] :
                    ord = maxorden['orden__max'] + 1
               new_promomedia = Promocion_Media(promocion = Promocion.objects.get(pk = int(request.POST['promo_id'])), media = new_media, orden = ord)
               new_promomedia.save()
               #~ except:
                    #~ print "Unexpected error:", sys.exc_info()

          # indicate that everything is OK for SWFUpload
          return HttpResponse("ok", mimetype="text/plain")

@user_passes_test(lambda u: u.is_superuser)
@csrf_exempt
def subidapag(request):
     if request.method == 'POST':
          for field_name in request.FILES:
               uploaded_file = request.FILES[field_name]
               new_media = Media(file = uploaded_file, tipo = request.POST['tipo_media'], inicial = False, asignado = True)
               new_media.save()
               ord = 0
               try:
                    maxorden = Pagina_Media.objects.filter(pagina__exact = int(request.POST['promo_id'])).aggregate(Max('orden'))
                    if maxorden['orden__max'] :
                         ord = maxorden['orden__max'] + 1
                    new_promomedia = Pagina_Media(pagina = Pagina.objects.get(pk = int(request.POST['promo_id'])), media = new_media, orden = ord)
                    new_promomedia.save()
               except:
                    print "Unexpected error:", sys.exc_info()

          # indicate that everything is OK for SWFUpload
          return HttpResponse("ok", mimetype="text/plain")

@user_passes_test(lambda u: u.is_superuser)
@json_view
def del_media(request):
     if request.is_ajax():
          p = Promocion_Media.objects.get(pk = request.POST['media_id'])
          p.media.delete()
          p.delete()
          return 'ok'

@user_passes_test(lambda u: u.is_superuser)
@json_view
def del_mediapag(request):
     if request.is_ajax():
          p = Pagina_Media.objects.get(pagina__id = request.POST['media_id'])
          p.media.delete()
          p.delete()
          return 'ok'

@user_passes_test(lambda u: u.is_superuser)
@json_view
def del_mediafon(request):
     if request.is_ajax():
          m = Media.objects.get(id = request.POST['media_id'])
          if Promocion_Media.objects.filter(media = m) or Pagina_Media.objects.filter(media = m):
               m.orden = None
               m.inicial = False
               m.save()
          else:
               m.delete()
          return 'ok'
          
@user_passes_test(lambda u: u.is_superuser)
@csrf_exempt
def nuevofon(request):
     print request.user.is_superuser, request.user
     if request.method == 'POST':
          ord = 0
          maxorden = Media.objects.filter(inicial = True).aggregate(Max('orden'))
          if maxorden['orden__max'] :
               ord = maxorden['orden__max'] + 1
          if request.POST.has_key('media_id'):
               m = Media.objects.get(pk = request.POST['media_id'])
               m.inicial = True
               m.orden = ord
               m.save()
               return HttpResponse("ok", mimetype="text/plain")
          else:
               try:
                    for field_name in request.FILES:
                         uploaded_file = request.FILES[field_name]
                         new_media = Media(file = uploaded_file, tipo = 'F', inicial = True, asignado = False, orden = ord)
                         new_media.save()
                         ord += 1
               except:
                    print "Unexpected error:", sys.exc_info()

               return HttpResponse("ok", mimetype="text/plain", status=200)

@user_passes_test(lambda u: u.is_superuser)
@json_view
def orden_media(request):
     if request.is_ajax():
          p = Promocion_Media.objects.get(pk = request.POST['media_id'])
          p.orden = request.POST['orden']
          p.save()
          return 'ok'

@user_passes_test(lambda u: u.is_superuser)
@json_view
def orden_mediapag(request):
     if request.is_ajax():
          p = Pagina_Media.objects.get(pk = request.POST['media_id'])
          p.orden = request.POST['orden']
          p.save()
          return 'ok'

@user_passes_test(lambda u: u.is_superuser)
@json_view
def orden_mediafon(request):
     if request.is_ajax():
          p = Media.objects.get(pk = request.POST['media_id'])
          p.orden = request.POST['orden']
          p.save()
          return 'ok'


@user_passes_test(lambda u: u.is_superuser)
@json_view
def titulo_media(request):
     if request.is_ajax():
          p = Promocion_Media.objects.get(pk = request.POST['media_id'])
          p.descripcion = request.POST['ds']
          p.save()
          return 'ok'

@user_passes_test(lambda u: u.is_superuser)
@json_view
def actualiza_promo(request):
     if request.is_ajax():
          kwargs = simplejson.loads(request.POST['campos'])
          Promocion.objects.filter(pk = request.POST['promo_id']).update(**kwargs)

@user_passes_test(lambda u: u.is_superuser)
@json_view
def actualiza_pag(request):
     if request.is_ajax():
          kwargs = simplejson.loads(request.POST['campos'])
          Contenido.objects.filter(pagina__id = request.POST['promo_id']).update(**kwargs)

@user_passes_test(lambda u: u.is_superuser)
@json_view
def ordena_promo(request):
     if request.is_ajax():
          p = Promocion.objects.get(pk = request.POST['promo_id'])
          p.orden = request.POST['orden']
          p.save()
          return 'ok'

@user_passes_test(lambda u: u.is_superuser)
@json_view          
def arregla_mnu(request):
     if request.is_ajax():
          pare = Menu.objects.get(nombre='Promociones') #Menú "Promociones" se tiene que llamar así
          Menu.objects.filter(padre = pare).delete()
          for p in Promocion.objects.filter(enmenu = True):
               cls = 'anterior'
               tit = 'Vendida'
               if p.vigente:
                    cls = 'actual'
                    tit = 'En venta'
               m = Menu(nombre = p.nombre,  uri = 'promo/' + str(p.id), clase = cls, title = tit,padre = pare, orden = p.orden) 
               m.save()
          return 'ok'

@user_passes_test(lambda u: u.is_superuser)
@json_view          
def modencuesta    (request):
     if request.is_ajax():     
          sv = Survey.objects.get(pk = request.POST['encuesta'])     
          setattr(sv, request.POST['campo'], int(request.POST['valor']))
          sv.save()
          return 'ok'

# -------------------------------------------------------------------
# Formularios
#--------------------------------------------------------------------
@user_passes_test(lambda u: u.is_superuser)
def frmPromo(request):
     promo = Promocion()
     titulo = 'Nueva promocion'
     if request.method == 'POST': # Formulario enviado
          promo.orden = 0
          form = PromoForm(request.POST, request.FILES, instance = promo) # Se enlaza el formulario con los datos enviados en el POST
          if form.is_valid(): 
               form.save()
               return HttpResponseRedirect(reverse('inicio')) # Redirección a la página origen
     else:
          form = PromoForm( instance = promo )

     return render_to_response('mdm/formulario.html', {'form': form, 'titulo':  titulo, },  context_instance=RequestContext(request))

